package org.framework.common.ext.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

import org.apache.commons.io.IOUtils;

/**
 * 配置文件读取工具
 * <p>描述: </p>
 * <p>Company: Professional</p>
 * @author chanlong(陈龙)
 * @date 2016年9月23日 下午1:27:17
 * @version 1.0.2016
 */
public class PropertiesUtil {
	
	private static Properties properties = new Properties();
	private static PropertiesUtil instance = null;

	/**
	 * 加载配置文件.
	 * @param filepath
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2015年11月18日 下午3:51:48
	 */
	public static PropertiesUtil loader(final String filepath) {
		InputStreamReader reader = null;
		InputStream input = null;
		try {
			input = PropertiesUtil.class.getResourceAsStream(filepath);
			reader = new InputStreamReader(input, "UTF-8");
			if(filepath.endsWith(".xml")){
				properties.loadFromXML(input);
			}else{
				properties.load(reader);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(input);
			IOUtils.closeQuietly(reader);
		}
		return newInstance();
	}
	
	/**
	 * 获取配置内容.
	 * @param key
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年1月13日 下午12:55:43
	 */
	public String getProperty(final String key){
		return properties.getProperty(key);
	}
	
	/**
	 * 获取配置内容（可用于SQL配置文件）.
	 * PS:根据替换规则替换内容
	 * @param string
	 * @param length
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年9月23日 下午1:27:44
	 */
	public String getProperty(final String key, final String regex, final String[] fields) {
		String str = properties.getProperty(key);
		return str.replace(regex, StringUtil.toSQLEscape(fields));
	}
	
	/**
	 * 获取配置内容（可用于SQL配置文件）.
	 * PS:根据fields参数顺序替换内容
	 * @param string
	 * @param length
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年9月23日 下午1:27:44
	 */
	public String getProperty(final String key, final String... fields) {
		String str = properties.getProperty(key);
		for (int i = 0; i < fields.length; i++) {
			str = str.replace("{"+i+"}",fields[i]);
		}
		return str;
	}
	
	/**
	 * 获取配置内容（可用于SQL配置文件）.
	 * @param key
	 * @param params
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年9月26日 下午3:38:47
	 */
	public String getProperty(final String key, final Map<String,Object> params) {
		String str = properties.getProperty(key);
		Set<Entry<String, Object>> entryset = params.entrySet();
		for (Entry<String, Object> entry : entryset) {
			str.replace("{"+entry.getKey()+"}", String.valueOf(entry.getValue()));
		}
		return str;
	}
	
	/*
	 * 创建实例
	 */
	private static PropertiesUtil newInstance(){
		if(instance == null){
			instance = new PropertiesUtil();
		}
		return instance;
	}
	
	public static void main(String[] args) {
		System.out.println(newInstance().getProperty("", "[?]", new String[]{"1","2"}));
	}
}
